package com.by.controller;

import com.by.common.bean.ResultBean;
import com.by.common.controller.BaseController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.HttpRequest;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * 文件上传控制类
 */
@Api(tags = "文件上传")
@RestController
@RequestMapping("/api")
public class UploadController extends BaseController {
    private final String  BASEDIR="";//所有文件上传根目录
    @PostMapping("/upload")
    @ApiOperation("单个文件上传")
    public ResultBean upload(MultipartFile file, HttpServletRequest request){
    String path=toUpload(file,request,null);
    return success("上传成功",path);
    }

    /**
     * 批量上传
     * @param files
     * @return
     */
    @PostMapping("/batch/upload")
    @ApiOperation("批量上传")
    public ResultBean batchupload(List<MultipartFile> files,HttpServletRequest request){
        List<String> list=new ArrayList<>();
        files.forEach(file -> {
            if(!files.isEmpty()){
                String tmp=toUpload(file,request,null);
                list.add(tmp);
            }
        });
        return success("上传成功",list);
    }

    /**
     * 上传单个文件
     * @param request
     * @param type 目录 如果为空，默认为images
     * @return
     */
    String toUpload(MultipartFile file,HttpServletRequest request ,String type){
        //获取文件上传的根目录
        FilePath filePath=initDir(request,type);
        String newFile=getNewFileName(file);
        //上传
        try {
            file.transferTo(new File(filePath.getRoot()+"\\"+newFile));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return filePath.getDir()+"/"+newFile;
    }
    /**
     * 文件存放初始目录
     * @param request
     * @param type
     * @return
     */
    FilePath initDir(HttpServletRequest request, String type){
        if(null==type||"".equals(type)){
            type="images";
        }
        //获取系统时间
        String relPath=BASEDIR+"/"+type+"/"+getSystemYMD();
        //获取服务器上传的根目录
        String root=request.getServletContext().getRealPath("/")+relPath;
        File dir=new File(root);
        if(!dir.exists()){
            dir.mkdirs();//创建目录
        }
        return new FilePath(dir.getAbsolutePath(),relPath);
    }

    class FilePath{
        String root;//根目录
        String dir;//相对目录

        public FilePath(String root, String dir) {
            this.root = root;
            this.dir = dir;
        }

        public String getRoot() {
            return root;
        }

        public void setRoot(String root) {
            this.root = root;
        }

        public String getDir() {
            return dir;
        }

        public void setDir(String dir) {
            this.dir = dir;
        }
    }
    /**
     * 获取新的文件名
     * @param file
     * @return
     */
    String getNewFileName(MultipartFile file){
        //获取上传的文件名
        String name=file.getOriginalFilename();
        //获取后缀
        String ext=name.substring(name.lastIndexOf("."));
        //新文件名
        String newName= UUID.randomUUID().toString()+ext;
        return newName;
    }
    /**
     * 获取系统当前时间 用来文件重命名部分
     * @return
     */
    String getSystemYMD(){
        LocalDate date=LocalDate.now();
        return date.format(DateTimeFormatter.ofPattern("yMMdd"));
    }
}
